package com.learning.spring.cloud.alibaba.ribbon.detail.config;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * ClassName: RibbonConfig
 * Description: Ribbon 自定义配置属性
 * <p>
 * 1、使用 RibbonClient，为特定 name 的 Ribbon Client 自定义配置.
 * 2、使用 @RibbonClient 的 configuration 属性，指定 Ribbon 的配置类.
 * Date: 2021/8/3 19:42 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
@Configuration
@RibbonClient(name = "01-ms-ribbon-order", configuration = RibbonConfig.OrderRibbonClient.class)
public class RibbonConfig {

    @Bean
    @LoadBalanced
    RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.build();
    }

    /**
     * 1、自定义的配置类，如果被主程序上下文的 @ComponentScan 扫描到，那么该类的配置信息将被所有的 @RibbonClient 共享
     * 2、如果想给某个 @RibbonClient 使用，可以手动指定不扫描或者修改类的包路径。
     * <p>
     * <p>
     * 自动配置类：RibbonAutoConfiguration
     * Ribbon 客户端配置：RibbonClientConfiguration
     */
    public static class OrderRibbonClient {


        /**
         * 定义负载均衡规则，改为随机
         *
         * @return
         */
        @Bean
        public IRule ribbonRule() {
            return new RandomRule();
        }


    }
}
